#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h> 
#include <pthread.h>

//Variaveis globais
int **mat1; //matriz de entrada 1


//Calcula o maximo do vetor
int max_matriz(int **mat, int dim)
{
   int i, j, max=-32000;
   for (i=0; i<dim; i++)
   {
	 for(j=0; j<dim; j++){
	      if (mat[i][j]>max)
	      {
		  max=mat[i][j];
	      }
	}
   }
   return(max);
}

//Calcula o menor valor da matriz
int min_matriz(int **mat, int dim)
{
   int i, j, min=32000;
   for (i=0; i<dim; i++)
   {
	 for(j=0; j<dim; j++){
	      if (mat[i][j]<min)
	      {
		  min=mat[i][j];
	      }
	}
   }
   return(min);
}

//Calcula a soma do vetor
int sum_matriz(int **mat, int dim)
{
   int i, j, sum=0;
   for (i=0; i<dim; i++)
   {
	 for(j=0; j<dim; j++){
	      sum = sum + mat[i][j];
	 }
   }
   return(sum);
}

//Aloca espaco de memoria para uma matriz 
int **alocaMatriz(int d) {
   int **mat; //matriz que sera retornada
   int i, j;    //variaveis auxiliares

   //aloca o espaco de memoria para a matriz de dimensao dxd
   mat = (int**) calloc(d, sizeof(int *));
   if (mat == NULL) {
       printf ("Erro de alocacao de memoria");
       return NULL;
   }
   for (i = 0; i < d; i++) {
      mat[i] = (int*) calloc(d, sizeof(int));
      if (mat[i] == NULL) {
         printf ("Erro de alocacao de memoria");
         return NULL;
      }
   }
   return mat; //retorna o ponteiro para a matriz
}


//Carrega uma matriz de um arquivo de entrada
int **carregaMatriz(int d) {
   int **mat; //matriz que sera retornada
   int i, j;    //variaveis auxiliares
  
   //aloca espaco de memoria para a matriz 
   mat = alocaMatriz(d);

   //le a matriz do arquivo de entrada padrao
   for (i = 0; i < d; i++) {
      for (j = 0; j < d; j++) {
         scanf("%d", &mat[i][j]);
      }
   }
   return mat; //retorna o ponteiro para a matriz
}

//Funcao principal, coleta os tempos de processamento
int main(int argc, char *argv[]) {
  struct timeval startTime, endTime;
  unsigned int totalUsecs;
  int dim;
  int max;
  int min;
  int sum;
  
  //Aloca espaco de memoria e carrega matrizes de entrada
  //--inicia o contador de tempo
  gettimeofday(&startTime, NULL);
  //guarda a dimensao da matriz
  scanf("%d", &dim);
  //--carrega as matrizes de entrada
  mat1 = carregaMatriz(dim);
  
  max = max_matriz(mat1, dim);
  min = min_matriz(mat1, dim);
  sum = sum_matriz(mat1, dim);
  
  printf("Menor %d\n", min);
  printf("Maior %d\n", max);
  printf("Soma %d\n", sum);
}